/*
 * arvore.c
 *
 *  Created on: 25/04/2011
 *      Author: joao
 */

#include <stdio.h>
#include <stdlib.h>

#include "arvore.h"

void P(no *p){
	printf("%d ", p->info);
}

void pre_ordem(no *raiz){
	if (raiz != NULL) {
		P(raiz);
		pre_ordem(raiz->esq);
		pre_ordem(raiz->dir);
	}
}

void in_ordem(no *raiz){
	if (raiz != NULL) {
		in_ordem(raiz->esq);
		P(raiz);
		in_ordem(raiz->dir);
	}
}

void pos_ordem(no *raiz){
	if(raiz != NULL){
		pos_ordem(raiz->esq);
		pos_ordem(raiz->dir);
		P(raiz);
	}
}

no  *busca(Tipo x, no *raiz){
	no *atual = raiz;

	while ((atual != NULL) && (atual->info != x))
    	if (x > atual->info) atual = atual->dir;
        else atual = atual->esq;
	return atual;
}


void BuscaInsere(Tipo x, no **p){

    if (*p==NULL) {  /* se o elemento nao foi encontrado, insere */
        *p = (no *)malloc(sizeof(no));
        (*p)->info = x;
        (*p)->esq = (*p)->dir = NULL;
        (*p)->cont = 1;
    }
    else
    	if (x<(*p)->info) BuscaInsere(x,&((*p)->esq));
    	else
    		if (x>(*p)->info) BuscaInsere(x,&((*p)->dir));
    		else
    			if (x == (*p)->info) (*p)->cont++;
}

/*void iniciaNovoNo (no **p){
	*p = (no *)malloc(sizeof(no));

	//(*p)->info = x;
	(*p)->esq = (*p)->dir = NULL;
	(*p)->cont = 1;
}*/

void imprime(no *raiz, int nivel) {
	/* Esta rotina e adequada para imprimir arvores com info de */
	/* comprimento maximo igual a 6 */
	int i;

	if (raiz == NULL) return;

	imprime(raiz->dir, nivel+1);

	for(i = 0; i < nivel; i++)
		printf("	");
	printf("%6d\n", raiz->info);

	imprime(raiz->esq, nivel+1);
}

void imprime2(no *raiz, FILE *saida) {
	/* Esta rotina e adequada para imprimir arvores com info de */
	/* comprimento maximo igual a 6 */


	if (raiz == NULL) return;

	imprime2(raiz->esq, saida);
	fprintf(saida, "%d %d\n", raiz->info, raiz->cont);
	imprime2(raiz->dir, saida);

}
